home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
051-075
/
scopedisk64
/
microray
/
uray.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
10KB
|
368 lines
/************************************************************************
* *
* Copyright (c) 1988, David B. Wecker *
* All Rights Reserved *
* *
* This file is part of DBW_uRAY *
* *
* DBW_uRAY is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY. No author or distributor accepts *
* responsibility to anyone for the consequences of using it or for *
* whether it serves any particular purpose or works at all, unless *
* he says so in writing. Refer to the DBW_uRAY General Public *
* License for full details. *
* *
* Everyone is granted permission to copy, modify and redistribute *
* DBW_uRAY, but only under the conditions described in the *
* DBW_uRAY General Public License. A copy of this license is *
* supposed to have been given to you along with DBW_uRAY so you *
* can know your rights and responsibilities. It should be in a file *
* named COPYING. Among other things, the copyright notice and this *
* notice must be preserved on all copies. *
************************************************************************
* *
* Authors: *
* DBW - David B. Wecker *
* *
* Versions: *
* V1.0 881023 DBW - First released version *
* V1.1 881110 DBW - Fixed scan coherence code *
* V1.2 881125 DBW - Removed ALL scan coherence code (useless) *
* added "fat" extent boxes *
* *
************************************************************************/
#define VERSION "uRAY v1.2 881125 (C) 1988 D. Wecker - all rights reserved\n"
/************************************************************************/
/************* global definitions for uray software *********************/
/************************************************************************/
#ifdef URAY_MAIN
# define MAINDEF
# define MAINVAL(a) = a
#else
# define MAINDEF extern
# define MAINVAL(a)
# endif
/******************** include files **************************************/
#include <stdio.h>
#include <math.h>
#include <signal.h>
#ifdef U__X
#include <sys/types.h>
#include <sys/times.h>
#endif
#ifdef VMS
#include <types.h>
#include <time.h>
#endif
#ifdef AMIGA
#ifndef SIGINT
# define SIGINT 1
# endif
#include <exec/types.h>
#include <intuition/intuition.h>
#endif
/********************** floating point defs ******************************/
#if DODOUBLE
# define FLTDBL double
# define MYHUGE ((double)1.0e+30)
# define TOL ((FLTDBL)1.0e-7) /* minimum tolerance */
# ifdef AMIGA
# define BIGF
# endif
#else
# define FLTDBL float
# define MYHUGE ((float)1.0e+17)
# define TOL ((FLTDBL)1.0e-4) /* minimum tolerance */
# endif
#ifdef BIGF
# define SCAN1 "%s %F"
# define SCAN2 "%s %F %F %F"
# define SCAN3 "%F %F %F %F %F %F %F %F %F %F %d %d %F %F %F %F %F %F"
# define SCAN4 "%F %F %F %F %F %F %F"
# define SCAN5 "%s %d %F %F %F %F"
# define SCAN6 "%s %d %F %F %F %F %F %F %F %F %F"
# define SCAN7 "%s %d %F %F %F %F %F %F %F %F %F %F %F"
#else
# define SCAN1 "%s %f"
# define SCAN2 "%s %f %f %f"
# define SCAN3 "%f %f %f %f %f %f %f %f %f %f %d %d %f %f %f %f %f %f"
# define SCAN4 "%f %f %f %f %f %f %f"
# define SCAN5 "%s %d %f %f %f %f"
# define SCAN6 "%s %d %f %f %f %f %f %f %f %f %f"
# define SCAN7 "%s %d %f %f %f %f %f %f %f %f %f %f %f"
# endif
/********************** debug defs ****************************************/
#define DEBUG_dumpnodes 0 /* dump a tree of all nodes and extents */
#define DEBUG_ilbm 0 /* show ILBM output info */
#define DEBUG_pixels 0 /* show pixel RGB values */
/*********************** global defs **************************************/
#define MAXCOLS 1024 /* maximum compute width */
#define ABS(a) (((a) < 0) ? -(a) : (a))
#define FABS(a) (((a) < 0.0) ? -(a) : (a))
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define vdot(A,B) (A[0]*B[0] + A[1]*B[1] + A[2]*B[2])
#define vnorm(A) sqrt(vdot(A,A))
#define vcopy(A,B) B[0]=A[0]; B[1]=A[1]; B[2]=A[2]
#define vscale(v,A,B) B[0]=(v)*A[0]; B[1]=(v)*A[1]; B[2]=(v)*A[2]
#define vcomb(v,A,B,C) C[0]=(v)*A[0]+B[0]; C[1]=(v)*A[1]+B[1]; C[2]=(v)*A[2]+B[2]
#define vadd(A,B,C) C[0]=A[0]+B[0]; C[1]=A[1]+B[1]; C[2]=A[2]+B[2]
#define vsub(A,B,C) C[0]=A[0]-B[0]; C[1]=A[1]-B[1]; C[2]=A[2]-B[2]
#define vmul(A,B,C) C[0]=A[0]*B[0]; C[1]=A[1]*B[1]; C[2]=A[2]*B[2]
#define vdir(A,B,C) vsub(B,A,C); vunit(C,C)
#define vcross(A,B,C) C[0]=(A[1] * B[2]) - (B[1] * A[2]); \
C[1]=(A[2] * B[0]) - (B[2] * A[0]); \
C[2]=(A[0] * B[1]) - (B[0] * A[1]);
/******************* ILBM file header defines *****************************/
#ifndef HIRES
# define HIRES 0x8000L
# endif
#ifndef HAM
# define HAM 0x800L
# endif
#ifndef LACE
# define LACE 0x4L
# endif
#define DEPTH 6
#define MAXBYTE (cols >> 3)
#define BMHDsize 20L /* chunk sizes */
#define CMAPsize 96L
#define CAMGsize 4L
#define BODYsize (((long)rows)*((long)(MAXBYTE))*(long)(DEPTH))
#define FORMsize (BODYsize+CAMGsize+CMAPsize+BMHDsize+36L)
/************************** object types *********************************/
#define TYP_E 0 /* extent */
#define TYP_S 1 /* sphere */
#define TYP_Q 2 /* quad */
#define TYP_T 3 /* triangle */
#define TYP_R 4 /* ring */
#define TYP_L 5 /* light */
/************************** typedefs **************************************/
typedef FLTDBL VEC[3];
typedef struct _ATT {
VEC color;
FLTDBL kd, ks, kt, ir, kl, dist, kf;
short wave, tex;
VEC p1,p2;
} ATT;
typedef struct _WAVE {
VEC cen;
FLTDBL phase, length, damp, amp;
} WAVE;
typedef struct _NODE {
struct _NODE *next;
unsigned char typ;
ATT *att;
VEC cen;
} NODE;
typedef struct _EXTENT {
NODE *next;
unsigned char typ;
VEC min,max;
NODE *child;
} EXTENT;
typedef struct _SPHERE {
NODE *next;
unsigned char typ;
ATT *att;
VEC cen;
FLTDBL rad;
} SPHERE;
typedef struct _QUAD {
NODE *next;
unsigned char typ;
ATT *att;
VEC p0, v1, v2;
} QUAD;
typedef struct _TRIANGLE {
NODE *next;
unsigned char typ;
ATT *att;
VEC p0, v1, v2;
} TRIANGLE;
typedef struct _RING {
NODE *next;
unsigned char typ;
ATT *att;
VEC p0, v1, v2;
FLTDBL rad1,rad2;
} RING;
typedef struct _LIGHT {
struct _LIGHT *next;
NODE *child;
} LIGHT;
/*************************** routines ***********************************/
char *malloc(),
*calloc(),
*my_malloc(),
*my_calloc();
void leave(),
vunit(),
planenormal(),
spherenormal(),
gettex(),
getamb(),
getlights(),
getspecular(),
gettrans(),
readinput(),
wfil(),
unionvector(),
unionextent(),
getextent(),
doextents(),
dumpnodes(),
coutputs(),
woutputs(),
trace(),
calcripple();
short rfil(),
PackRow();
NODE *intersection(),
*intersection2(),
*hitextent(),
*hitsphere(),
*sortext(),
*doalloc(),
*srtext();
FLTDBL rnd(),
findnormal();
long random();
/*************************** variables ***********************************/
MAINDEF long seed MAINVAL(257);
MAINDEF char str[256],
cmd[256],
*basnam MAINVAL("uray");
MAINDEF char *TYPstr MAINVAL("ESQTRLF");
MAINDEF VEC NEAR
#ifdef URAY_MAIN
= {0.0, 0.0, 1.0}
#endif
;
MAINDEF VEC FAR
#ifdef URAY_MAIN
= {0.0, 0.0, 1.0}
#endif
;
MAINDEF VEC GROUND
#ifdef URAY_MAIN
= {0.6, 0.3, 0.3}
#endif
;
MAINDEF VEC BLACK
#ifdef URAY_MAIN
= { 0.0, 0.0, 0.0 }
#endif
;
MAINDEF VEC from,
direction,
dirinv;
MAINDEF NODE *nodes MAINVAL(NULL);
MAINDEF FILE *fp MAINVAL(NULL);
MAINDEF FILE *fp2 MAINVAL(NULL);
MAINDEF unsigned char outary[3][MAXCOLS];
MAINDEF short rows MAINVAL(400);
MAINDEF short startrow MAINVAL(0);
MAINDEF short endrow MAINVAL(400);
MAINDEF short cols MAINVAL(320);
MAINDEF short bpp MAINVAL(12);
MAINDEF short sline;
MAINDEF short obpsl;
MAINDEF short aov MAINVAL(90);
MAINDEF short depth MAINVAL(20);
MAINDEF int natts MAINVAL(0);
MAINDEF ATT *atts MAINVAL(NULL);
MAINDEF int nwaves MAINVAL(0);
MAINDEF WAVE *waves MAINVAL(NULL);
MAINDEF int row,
col;
MAINDEF int fnhits MAINVAL(0),
gnhits MAINVAL(0),
fehits MAINVAL(0),
gehits MAINVAL(0);
MAINDEF EXTENT *ext;
MAINDEF SPHERE *sph;
MAINDEF QUAD *qua;
MAINDEF TRIANGLE *tri;
MAINDEF RING *rin;
MAINDEF LIGHT *lights MAINVAL(NULL);
MAINDEF int extcnt MAINVAL(0);
MAINDEF int objcnt MAINVAL(0);
MAINDEF FLTDBL aspect MAINVAL(0.544);
MAINDEF FLTDBL base MAINVAL(0.25);
MAINDEF long lng,
pos1,
pos2,
pos3,
lsize;
MAINDEF short wrd;
MAINDEF unsigned char byt;
MAINDEF int lstcolor MAINVAL(0);
MAINDEF unsigned char colors[16][3];
MAINDEF long randtbl[ 63 ]
#ifdef URAY_MAIN
= {
0x00000001, 0x41c67ea6, 0x967eb0e7,
0x2781e494, 0xc46b9b3d, 0xf94bdf32, 0x95fb7483,
0xd9e2b600, 0x9cfbae39, 0xbf54bc7e, 0x0ff6d5df,
0x0abd322c, 0x31dff4f5, 0x237c228a, 0xaf1cf0fb,
0x7de14518, 0xc487eb71, 0xe201dd56, 0xd2bfa1d7,
0xe2319ac4, 0xe3decdad, 0xe95678e2, 0x93728473,
0x500f9f30, 0x284797a9, 0x2c67412e, 0x7566f4cf,
0x42877e5c, 0xb3590565, 0x4daa423a, 0xe4880eeb,
0xf73c2448, 0xef5992e1, 0xeeea4806, 0x5656aec7,
0xe1133cf4, 0xca7b7c1d, 0x31d2de92, 0xad857063,
0x99a13460, 0x69d8bd19, 0xb53c51de, 0x3b54afbf,
0x7d55368c, 0x102f11d5, 0x1b37adea, 0x7aae88db,
0xde652f78, 0xb45bf651, 0xe3dabeb6, 0x6102d7b7,
0x7a79cb24, 0x8398a68d, 0x28cc1042, 0xe0e33853,
0x9f1a7590, 0x4b761e89, 0x858eee8e, 0xfa5f06af,
0x28d95abc, 0x87991a45, 0x388f659a, 0x751f5ecb }
#endif
;
MAINDEF long *fptr MAINVAL(&randtbl[ 2 ]);
MAINDEF long *rptr MAINVAL(&randtbl[ 0 ]);
MAINDEF long *end_ptr MAINVAL(&randtbl[ 63 ]);
#ifdef AMIGA
MAINDEF struct IntuitionBase *IntuitionBase;
# endif